package Moteur;

import java.util.ArrayList;
import java.util.List;

import Commande.Command;

public class MoteurImpl implements MoteurMetronome {

	private Boolean etatMarche=false;
	private double tempo;
	private Integer tempsParMesure=4;
	private Command commandeMarquerTemps, commandeMarquerMesure; 
	private List<Observer> listeObserver;
	


	public MoteurImpl(){
		listeObserver = new ArrayList<Observer>();
	}


	@Override
	public Boolean getEtatMarche() {
		return etatMarche;
	}

	@Override
	public void setEtatMarche(Boolean etatMarche) {
		this.etatMarche = etatMarche;
	}
	
	public List<Observer> getListeObserver() {
		return listeObserver;
	}


	public void setListeObserver(List<Observer> listeObserver) {
		this.listeObserver = listeObserver;
	}


	@Override
	public double getTempo() {
		return tempo;
	}

	@Override
	public void setTempo(Integer tempo) {
		this.tempo = tempo;
		notifyObserver(tempo);
	}

	@Override
	public Integer getNbTempsParMesure() {
		return tempsParMesure;
	}

	@Override
	public void setNbTempsParMesure(Integer tempsParMesure) {
		this.tempsParMesure = tempsParMesure;	
	}

	@Override
	public void setCmdMarquerTemps(Command commandeMarquerTemps) {
		this.commandeMarquerTemps = commandeMarquerTemps;
	}

	@Override
	public void setCmdMarquerMesure(Command commandeMarquerMesure) {
		this.commandeMarquerMesure = commandeMarquerMesure;
	}

	@Override
	public void add(Observer observer) {
		listeObserver.add(observer);
	}

	@Override
	public void delete(Observer observer) {
		listeObserver.remove(observer);
	}


	public Command getCommandeMarquerTemps() {
		return commandeMarquerTemps;
	}

	public Command getCommandeMarquerMesure() {
		return commandeMarquerMesure;
	}

	@Override
	public void notifyObserver(Integer valeur) {
		for(int i=0;i<listeObserver.size();i++){
			listeObserver.get(i).updateTempo(valeur);
		}
	}

	public void notifyObserver() {
		for(int i=0;i<listeObserver.size();i++){
			listeObserver.get(i).update();
		}
	}


	@Override
	public void decrease() {
		if(tempsParMesure > 1)
			tempsParMesure--;
	}


	@Override
	public void increase() {
		if(tempsParMesure < 7)
			tempsParMesure++;
	}
	
	public Integer getTempsParMesure(){
		return tempsParMesure;
	}


}
